#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
增强版 Joycon 读取器演示
展示功能，即使没有实际的 Joycon 设备
"""

import time
import math
from read_joycon import JoyconControllerReader, GyroscopeData, AccelerometerData

def create_mock_data():
    """创建模拟数据用于演示"""
    # 模拟陀螺仪数据
    gyro_L = GyroscopeData(
        x=math.sin(time.time()) * 500,
        y=math.cos(time.time()) * 300,
        z=math.sin(time.time() * 2) * 200,
        magnitude=math.sqrt(500**2 + 300**2 + 200**2)
    )
    
    gyro_R = GyroscopeData(
        x=math.cos(time.time()) * 400,
        y=math.sin(time.time() * 1.5) * 600,
        z=math.cos(time.time() * 0.5) * 150,
        magnitude=math.sqrt(400**2 + 600**2 + 150**2)
    )
    
    # 模拟加速度计数据
    accel_L = AccelerometerData(
        x=math.sin(time.time()) * 2,
        y=math.cos(time.time()) * 1.5,
        z=9.8 + math.sin(time.time() * 0.5) * 0.5,
        magnitude=math.sqrt(2**2 + 1.5**2 + 10.3**2),
        pitch=math.atan2(1.5, math.sqrt(2**2 + 10.3**2)) * 180 / math.pi,
        roll=math.atan2(-2, math.sqrt(1.5**2 + 10.3**2)) * 180 / math.pi
    )
    
    accel_R = AccelerometerData(
        x=math.cos(time.time()) * 1.8,
        y=math.sin(time.time() * 1.2) * 2.2,
        z=9.8 + math.cos(time.time() * 0.8) * 0.3,
        magnitude=math.sqrt(1.8**2 + 2.2**2 + 10.1**2),
        pitch=math.atan2(2.2, math.sqrt(1.8**2 + 10.1**2)) * 180 / math.pi,
        roll=math.atan2(-1.8, math.sqrt(2.2**2 + 10.1**2)) * 180 / math.pi
    )
    
    return gyro_L, gyro_R, accel_L, accel_R

def demo_visualization():
    """演示可视化功能"""
    print("🎬 增强版 Joycon 读取器演示")
    print("=" * 60)
    print("即使没有实际的 Joycon 设备，也能展示功能特性")
    print("=" * 60)
    
    # 创建控制器实例
    controller = JoyconControllerReader()
    
    # 模拟运行时间
    duration = 15  # 15秒演示
    start_time = time.time()
    
    try:
        while time.time() - start_time < duration:
            # 创建模拟数据
            gyro_L, gyro_R, accel_L, accel_R = create_mock_data()
            
            # 更新控制器数据
            controller.gyro_data_L = gyro_L
            controller.gyro_data_R = gyro_R
            controller.accel_data_L = accel_L
            controller.accel_data_R = accel_R
            
            # 创建模拟输入数据
            mock_data = {
                'buttons': {
                    'demo_button': {
                        'name': 'Demo Button',
                        'joystick_id': 'Demo',
                        'pressed': int(time.time()) % 2 == 0,  # 每秒切换
                        'changed': True
                    }
                },
                'axes': {
                    'demo_stick': {
                        'name': 'Demo Stick',
                        'joystick_id': 'Demo',
                        'value': math.sin(time.time() * 2) * 0.8,
                        'changed': True
                    }
                },
                'gyro_L': gyro_L,
                'gyro_R': gyro_R,
                'accel_L': accel_L,
                'accel_R': accel_R
            }
            
            # 显示状态
            controller.print_status(mock_data)
            
            # 显示演示信息
            remaining = int(duration - (time.time() - start_time))
            print(f"\n⏰ 演示剩余时间: {remaining} 秒 | 按 Ctrl+C 退出")
            
            time.sleep(0.1)  # 10 FPS
            
    except KeyboardInterrupt:
        print("\n⏹️ 演示结束")
    
    print("\n✅ 演示完成！")
    print("\n📋 功能总结:")
    print("• ✅ 实时传感器数据可视化")
    print("• ✅ 进度条显示摇杆位置")
    print("• ✅ 陀螺仪和加速度计数据")
    print("• ✅ 角度计算 (俯仰角、横滚角)")
    print("• ✅ 活动输入摘要")
    print("• ✅ 双库支持 (pyjoycon + pygame)")
    print("• ✅ 自动设备检测")
    print("• ✅ 错误处理和恢复")

def demo_code_examples():
    """演示代码示例"""
    print("\n" + "=" * 60)
    print("💻 代码使用示例")
    print("=" * 60)
    
    print("""
# 基本使用
from read_joycon import JoyconControllerReader

# 创建控制器
controller = JoyconControllerReader()

# 读取数据
data = controller.read_inputs()

# 访问传感器数据
if controller.joycon_L:
    gyro = data['gyro_L']
    accel = data['accel_L']
    print(f"陀螺仪: {gyro.magnitude:.1f}°/s")
    print(f"加速度: {accel.magnitude:.1f}m/s²")
    print(f"俯仰角: {accel.pitch:.1f}°")
    print(f"横滚角: {accel.roll:.1f}°")

# 访问按钮数据
for button_key, btn_info in data['buttons'].items():
    if btn_info['pressed']:
        print(f"按下: {btn_info['name']}")

# 运行主循环
controller.run(update_rate=30.0)
""")

def main():
    """主函数"""
    print("🎮 Joycon 增强版读取器功能演示")
    print("=" * 60)
    
    # 运行可视化演示
    demo_visualization()
    
    # 显示代码示例
    demo_code_examples()
    
    print("\n" + "=" * 60)
    print("🎉 演示完成！")
    print("=" * 60)
    print("\n📖 更多信息请查看 README_enhanced.md")
    print("🧪 运行测试: python test_enhanced_joycon.py")
    print("🎮 实际使用: python read_joycon.py")

if __name__ == "__main__":
    main() 